home *** CD-ROM | disk | FTP | other *** search
/ Mac Mania 4 / MacMania 4.toast / / Demo's / Igor Demo Pro / 1 PutContentsIn Igor Pro Folder / WaveMetrics Procedures / Analysis / Peak Fitting / Peak Functions < prev   
Text File  |  1994-11-14  |  5KB  |  273 lines

  1. |
  2. |    The functions in this file are user defined versions of the XFUNCs provided by the
  3. |    GaussFit, LorentzianFit and VoigtFit XOP modules.  They are provided mainly
  4. |    for use when you are running on a 68K machine that lacks a floating point
  5. |    processor unit (i.e., a 68LC040 machine such as a notebook). They can also be
  6. |    uesd to get an idea how much faster XFUNCs are than user defined functions. 
  7. |
  8. |    The names of the functions provided here are the same as the corresponding
  9. |    XFUNCs except these have a prefix of "f".
  10. |
  11. |    For documentation, see the coresponding documentation for the above named
  12. |    XFUNCs.
  13.  
  14.  
  15. |************* Gaussian *************
  16.  
  17. Function fGaussFit(w,x)
  18.     Wave w; Variable x
  19.     
  20.     Variable r= w[0]
  21.     variable npts= numpnts(w),i=1
  22.     do
  23.         if( i>=npts )
  24.             break
  25.         endif
  26.         r += w[i]*exp(-((x-w[i+1])/w[i+2])^2)
  27.         i+=3
  28.     while(1)
  29.     return r
  30. End
  31.  
  32. Function fGaussFitBL(w,x)
  33.     Wave w; Variable x
  34.     
  35.     Variable xprime= (x-w[0])/w[1]
  36.     Variable r= w[2]+w[3]*xprime+w[4]*xprime^2+w[5]*xprime^3
  37.     variable npts= numpnts(w),i=6
  38.     do
  39.         if( i>=npts )
  40.             break
  41.         endif
  42.         r += w[i]*exp(-((x-w[i+1])/w[i+2])^2)
  43.         i+=3
  44.     while(1)
  45.     return r
  46. End
  47.  
  48. Function fGaussFit1Width(w,x)
  49.     Wave w; Variable x
  50.     
  51.     Variable r= w[0],width= w[1]
  52.     variable npts= numpnts(w),i=2
  53.     do
  54.         if( i>=npts )
  55.             break
  56.         endif
  57.         r += w[i]*exp(-((x-w[i+1])/width)^2)
  58.         i+=2
  59.     while(1)
  60.     return r
  61. End
  62.  
  63. Function fGaussFit1WidthBL(w,x)
  64.     Wave w; Variable x
  65.     
  66.     Variable xprime= (x-w[0])/w[1],width= w[6]
  67.     Variable r= w[2]+w[3]*xprime+w[4]*xprime^2+w[5]*xprime^3
  68.     variable npts= numpnts(w),i=7
  69.     do
  70.         if( i>=npts )
  71.             break
  72.         endif
  73.         r += w[i]*exp(-((x-w[i+1])/width)^2)
  74.         i+=2
  75.     while(1)
  76.     return r
  77. End
  78.  
  79. |************* Lorentzian *************
  80.  
  81. Function fLorentzianFit(w,x)
  82.     Wave w; Variable x
  83.     
  84.     Variable r= w[0]
  85.     variable npts= numpnts(w),i=1
  86.     do
  87.         if( i>=npts )
  88.             break
  89.         endif
  90.         r += w[i]/((x-w[i+1])^2+w[i+2])
  91.         i+=3
  92.     while(1)
  93.     return r
  94. End
  95.  
  96. Function fLorentzianFitBL(w,x)
  97.     Wave w; Variable x
  98.     
  99.     Variable xprime= (x-w[0])/w[1]
  100.     Variable r= w[2]+w[3]*xprime+w[4]*xprime^2+w[5]*xprime^3
  101.     variable npts= numpnts(w),i=6
  102.     do
  103.         if( i>=npts )
  104.             break
  105.         endif
  106.         r += w[i]/((x-w[i+1])^2+w[i+2])
  107.         i+=3
  108.     while(1)
  109.     return r
  110. End
  111.  
  112.  
  113. Function fLorentzianFit1Width(w,x)
  114.     Wave w; Variable x
  115.     
  116.     Variable r= w[0],width= w[1]
  117.     variable npts= numpnts(w),i=2
  118.     do
  119.         if( i>=npts )
  120.             break
  121.         endif
  122.         r += w[i]/((x-w[i+1])^2+width)
  123.         i+=2
  124.     while(1)
  125.     return r
  126. End
  127.  
  128. Function fLorentzianFit1WidthBL(w,x)
  129.     Wave w; Variable x
  130.     
  131.     Variable xprime= (x-w[0])/w[1],width= w[6]
  132.     Variable r= w[2]+w[3]*xprime+w[4]*xprime^2+w[5]*xprime^3
  133.     variable npts= numpnts(w),i=7
  134.     do
  135.         if( i>=npts )
  136.             break
  137.         endif
  138.         r += w[i]/((x-w[i+1])^2+width)
  139.         i+=2
  140.     while(1)
  141.     return r
  142. End
  143.  
  144. |************* Voigt *************
  145.  
  146.  
  147. Function fVoigt(X,Y)
  148.     variable X,Y
  149.     
  150.     Y= abs(Y)
  151.     X= abs(X)
  152.  
  153.     variable/C W,U,T= cmplx(Y,-X)
  154.     variable S= X+Y
  155.  
  156.     if( S >= 15 )                                |        Region I
  157.         W= T*0.5641896/(0.5+T*T)
  158.     else
  159.         if( S >= 5.5 )                             |        Region II
  160.             U= T*T
  161.             W= T*(1.410474+U*0.5641896)/(0.75+U*(3+U))
  162.         else
  163.             if( Y >= (0.195*X-0.176) )     |        Region III
  164.                 W= (16.4955+T*(20.20933+T*(11.96482+T*(3.778987+T*0.5642236))))
  165.                 W /= (16.4955+T*(38.82363+T*(39.27121+T*(21.69274+T*(6.699398+T)))))
  166.             else                                    |        Region IV
  167.                 U= T*T
  168.                 W= T*(36183.31-U*(3321.9905-U*(1540.787-U*(219.0313-U*(35.76683-U*(1.320522-U*0.56419))))))
  169.                 W /= (32066.6-U*(24322.84-U*(9022.228-U*(2186.181-U*(364.2191-U*(61.57037-U*(1.841439-U)))))))
  170.                 W= cmplx(exp(real(U))*cos(imag(U)),0)-W
  171.             endif
  172.         endif
  173.     endif
  174.     return real(W)
  175. end
  176.  
  177.  
  178. Function fVoigtFit(w,x)
  179.     Wave w; Variable x
  180.     
  181.     Variable r= w[0]
  182.     variable npts= numpnts(w),i=1
  183.     do
  184.         if( i>=npts )
  185.             break
  186.         endif
  187.         r += w[i]*fVoigt(w[i+1]*(x-w[i+2]),w[i+3])
  188.         i+=4
  189.     while(1)
  190.     return r
  191. End
  192.  
  193. Function fVoigtFitBL(w,x)
  194.     Wave w; Variable x
  195.     
  196.     Variable xprime= (x-w[0])/w[1]
  197.     Variable r= w[2]+w[3]*xprime+w[4]*xprime^2+w[5]*xprime^3
  198.     variable npts= numpnts(w),i=6
  199.     do
  200.         if( i>=npts )
  201.             break
  202.         endif
  203.         r += w[i]*fVoigt(w[i+1]*(x-w[i+2]),w[i+3])
  204.         i+=4
  205.     while(1)
  206.     return r
  207. End
  208.  
  209.  
  210. Function fVoigtFit1Shape(w,x)
  211.     Wave w; Variable x
  212.     
  213.     Variable r= w[0],shape= w[1]
  214.     variable npts= numpnts(w),i=2
  215.     do
  216.         if( i>=npts )
  217.             break
  218.         endif
  219.         r += w[i]*fVoigt(w[i+1]*(x-w[i+2]),shape)
  220.         i+=3
  221.     while(1)
  222.     return r
  223. End
  224.  
  225. Function fVoigtFit1ShapeBL(w,x)
  226.     Wave w; Variable x
  227.     
  228.     Variable xprime= (x-w[0])/w[1],shape= w[6]
  229.     Variable r= w[2]+w[3]*xprime+w[4]*xprime^2+w[5]*xprime^3
  230.     variable npts= numpnts(w),i=7
  231.     do
  232.         if( i>=npts )
  233.             break
  234.         endif
  235.         r += w[i]*fVoigt(w[i+1]*(x-w[i+2]),shape)
  236.         i+=3
  237.     while(1)
  238.     return r
  239. End
  240.  
  241.  
  242. Function fVoigtFit1Shape1Width(w,x)
  243.     Wave w; Variable x
  244.     
  245.     Variable r= w[0],shape= w[1],width= w[2]
  246.     variable npts= numpnts(w),i=3
  247.     do
  248.         if( i>=npts )
  249.             break
  250.         endif
  251.         r += w[i]*fVoigt(width*(x-w[i+1]),shape)
  252.         i+=2
  253.     while(1)
  254.     return r
  255. End
  256.  
  257. Function fVoigtFit1Shape1WidthBL(w,x)
  258.     Wave w; Variable x
  259.     
  260.     Variable xprime= (x-w[0])/w[1],shape= w[6],width= w[7]
  261.     Variable r= w[2]+w[3]*xprime+w[4]*xprime^2+w[5]*xprime^3
  262.     variable npts= numpnts(w),i=8
  263.     do
  264.         if( i>=npts )
  265.             break
  266.         endif
  267.         r += w[i]*fVoigt(width*(x-w[i+1]),shape)
  268.         i+=2
  269.     while(1)
  270.     return r
  271. End
  272.  
  273.